/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ugc.cnel.manabi.bakenbeans;

import com.icesoft.faces.context.effects.Highlight;
import com.icesoft.faces.context.effects.JavascriptContext;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import javax.faces.model.SelectItem;
import org.ugc.cnel.manabi.entidades.Inspeccion;
import org.ugc.cnel.manabi.entidades.Rol;
import org.ugc.cnel.manabi.entidades.RolUsuario;
import org.ugc.cnel.manabi.entidades.Usuario;
import org.ugc.cnel.manabi.jpa.RolJpaController;
import org.ugc.cnel.manabi.jpa.RolUsuarioJpaController;
import org.ugc.cnel.manabi.jpa.UsuarioJpaController;
import org.ugc.cnel.manabi.jpa.exceptions.IllegalOrphanException;
import org.ugc.cnel.manabi.jpa.exceptions.NonexistentEntityException;
import org.ugc.cnel.manabi.jpa.exceptions.PreexistingEntityException;
import org.ugc.cnel.manabi.recursos.Utilidades;

/**
 *
 * @author Admin
 */
public class usuarioBakenBean {

    private eventosBakenBean ventana;
    private navegacionBakenBean nav;
    private Usuario usuarioseleccionado;
    private final UsuarioJpaController usujpa;
    private List<Usuario> lista;
    private boolean btn_save_disable = true;
    private boolean disabled = true;
    //Campos del formulario
    private String cedula;
    private String apellido;
    private String clave1;
    private String clave2;
    private String mail;
    private boolean estado;
    private boolean admin;
    private String nombre;
    private boolean required = false;
    private Integer id;
    private final SesionBean sessionbean;
    private Integer[] roles;
    private List<SelectItem> listaroles = new ArrayList<SelectItem>();
    private final RolJpaController roljpa;
    private final RolUsuarioJpaController rolusrjpa;

    public Integer[] getRoles() {
        return roles;
    }

    public void setRoles(Integer[] roles) {
        this.roles = roles;
    }

    public List<SelectItem> getListaroles() {
        return listaroles;
    }

    public void setListaroles(List<SelectItem> listaroles) {
        this.listaroles = listaroles;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public boolean isRequired() {
        return required;
    }

    public void setRequired(boolean requiered) {
        this.required = requiered;
    }

    public String getCedula() {
        return cedula;
    }

    public void setCedula(String cedula) {
        this.cedula = cedula;
    }

    public boolean isAdmin() {
        return admin;
    }

    public void setAdmin(boolean admin) {
        this.admin = admin;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public String getClave1() {
        return clave1;
    }

    public void setClave1(String clave1) {
        this.clave1 = clave1;
    }

    public String getClave2() {
        return clave2;
    }

    public void setClave2(String clave2) {
        this.clave2 = clave2;
    }

    public boolean isEstado() {
        return estado;
    }

    public void setEstado(boolean estado) {
        this.estado = estado;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /** Creates a new instance of usuarioBakenBean */
    public usuarioBakenBean() {
        this.disabled = true;
        FacesContext facesContext = FacesContext.getCurrentInstance();
        usujpa = (UsuarioJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "UsuarioJPA");
        sessionbean = (SesionBean) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "SesionBean");
        roljpa = (RolJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "RolJPA");
        rolusrjpa = (RolUsuarioJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "RolUsuarioJPA");
        List<Rol> rolesl = roljpa.findRolEntities();
        for (Rol rol : rolesl) {
            this.listaroles.add(new SelectItem(rol.getId(), rol.getDescripcion()));
        }
    }

    public void nuevo(ActionEvent evt) {
        this.id = 0;
        this.cedula = "";
        this.nombre = "";
        this.apellido = "";
        this.clave1 = "";
        this.clave2 = "";
        this.mail = "";
        this.estado = false;
        this.admin = false;
        this.roles = null;
        this.required = true;
        if (this.disabled) {
            this.disabled = false;
        }
        this.btn_save_disable=false;
        this.usuarioseleccionado = null;
        JavascriptContext.applicationFocus(FacesContext.getCurrentInstance(), "form_sistema:txt_cedula_usuario");
    }

    public void guardar(ActionEvent evt) {

        if (!this.clave1.equals(this.clave2)) {
            FacesMessage message = new FacesMessage();

            message.setDetail("Las Claves Ingresadas deben ser iguales");
            message.setSummary("Las Claves Ingresadas deben ser iguales");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage("form_sistema:clave_usuario", message);
            JavascriptContext.fireEffect(new Highlight("#fda505"), "form_sistema:clave_usuario", FacesContext.getCurrentInstance());
            JavascriptContext.fireEffect(new Highlight("#fda505"), "form_sistema:clave_usuario_r", FacesContext.getCurrentInstance());
            return;
        }
        if (this.usuarioseleccionado != null) {

            Usuario usr = new Usuario(this.getId());
            usr.setApellido(this.apellido);
            usr.setNombre(this.nombre);
            usr.setCedula(this.cedula);
            if (this.clave1.equals("*****")) {
                usr.setClave(usuarioseleccionado.getClave());
            } else {
                usr.setClave(Utilidades.md5(this.clave1));
            }
            usr.setEsadmin(this.admin);
            usr.setEstado(this.estado);

            usr.setCorreo(this.getMail());
            //los roles del usuario en la base
            Iterator<RolUsuario> rolusuario = this.usuarioseleccionado.getRolUsuarioCollection().iterator();
            //eliminarlos
            while (rolusuario.hasNext()) {
                RolUsuario ru = rolusuario.next();
                try {
                    rolusrjpa.destroy(ru.getId());
                } catch (NonexistentEntityException ex) {
                    Logger.getLogger(usuarioBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            //Cargarlos de nuevo con los nuevos valores
            for (int i = 0; i < roles.length; i++) {
                Integer integer = roles[i];
                Rol r = roljpa.findRol(integer);
                RolUsuario rus = new RolUsuario();
                rus.setIdRol(r);
                rus.setIdUsuario(usr);
                try {
                    rolusrjpa.create(rus);
                } catch (PreexistingEntityException ex) {
                    Logger.getLogger(usuarioBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    Logger.getLogger(usuarioBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            usr.setIdUsuarioModifica(sessionbean.getUsu_login().getId());
            usr.setRolUsuarioCollection(rolusrjpa.getEntityManager().createQuery("select r from RolUsuario r where r.idUsuario=:idusuario").setParameter("idusuario", this.usuarioseleccionado).getResultList());
            usr.setInspeccionCollection(this.usuarioseleccionado.getInspeccionCollection());
            try {

                usujpa.edit(usr);
                getVentana().setPopup_header("Informacion");
                getVentana().setPopup_conten("Se ha moficado correctamente");
            } catch (IllegalOrphanException ex) {
                getVentana().setPopup_header("Error");
                getVentana().setPopup_conten(ex.getMessage());
                Logger.getLogger(usuarioBakenBean.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                getVentana().setPopup_header("Error");
                getVentana().setPopup_conten(ex.getMessage());
            } catch (Exception ex) {
                getVentana().setPopup_header("Error");
                getVentana().setPopup_conten(ex.getMessage());
            }
            getVentana().setPopup_visible(true);
            return;
        }
        //Crea
        Usuario usr = new Usuario(this.getId(), this.getCedula(), this.getNombre(), this.getApellido(), this.isEstado(), Utilidades.md5(this.getClave1()), this.isAdmin());
        usr.setCorreo(this.getMail());
        usr.setIdUsuarioModifica(sessionbean.getUsu_login().getId());
        usr.setFechaRegistro(new Date());
        usr.setRolUsuarioCollection(new ArrayList<RolUsuario>());
        usr.setInspeccionCollection(new ArrayList<Inspeccion>());
        try {
            usujpa.create(usr);
            //Cargar los roles del usuario y guardarlos en la tabla
            for (Integer idrol : this.roles) {
                RolUsuario ru = new RolUsuario();
                ru.setIdRol(roljpa.findRol(idrol));
                ru.setIdUsuario(usr);
                rolusrjpa.create(ru);
            }

            getVentana().setPopup_header("Informacion");
            getVentana().setPopup_conten("Se ha Guardado correctamente");
        } catch (IllegalOrphanException ex) {
            getVentana().setPopup_header("Error");
            getVentana().setPopup_conten(ex.getMessage());
            Logger.getLogger(usuarioBakenBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            getVentana().setPopup_header("Error");
            getVentana().setPopup_conten(ex.getMessage());
        } catch (Exception ex) {
            getVentana().setPopup_header("Error");
            getVentana().setPopup_conten(ex.getMessage());
        }
        getVentana().setPopup_visible(true);
        //Limpiar
        cancel(null);

    }

    public void cancel(ActionEvent evt) {
//        if (evt.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
//            evt.queue();
//            return;
//        }
        this.usuarioseleccionado = null;
        this.id = 0;
        this.cedula = "";
        this.nombre = "";
        this.apellido = "";
        this.clave1 = "";
        this.clave2 = "";
        this.mail = "";
        this.estado = false;
        this.admin = false;
        this.required = false;
        this.roles = null;
        this.disabled = true;
        this.btn_save_disable=true;
    }

    public void editar(ActionEvent evt) {

        usuarioseleccionado = (Usuario) evt.getComponent().getAttributes().get("idfila");
        if (usuarioseleccionado != null) {
            this.id = usuarioseleccionado.getId();
            this.cedula = usuarioseleccionado.getCedula();
            this.nombre = usuarioseleccionado.getNombre();
            this.apellido = usuarioseleccionado.getApellido();
            this.clave1 = "*****";
            this.clave2 = "*****";
            this.mail = usuarioseleccionado.getCorreo();
            this.estado = usuarioseleccionado.getEstado();
            this.admin = usuarioseleccionado.getEsadmin();
            this.required = true;
            if (this.disabled == true) {
                this.disabled = false;
            }
            this.btn_save_disable=false;
            this.roles = new Integer[usuarioseleccionado.getRolUsuarioCollection().size()];
            int c = 0;
            for (RolUsuario rol_usuario : usuarioseleccionado.getRolUsuarioCollection()) {
                this.roles[c] = rol_usuario.getIdRol().getId();
                c++;

            }
        }
        JavascriptContext.focus(FacesContext.getCurrentInstance(), "form_sistema:txt_cedula_usuario");
    }

    public void borrar(ActionEvent evt) {
        usuarioseleccionado = (Usuario) evt.getComponent().getAttributes().get("idfila");
        if (usuarioseleccionado != null) {
            getVentana().setPopup_header("Advertencia");
            getVentana().setPopup_conten("¿Desea Eliminar el Registro?");
            getVentana().setTipo_ventana(eventosBakenBean.ACEPTAR_CANCELAR);
            getVentana().setPopup_visible(true);
            // Agregar el ActionListener en caso que el boton aceptar sea presionado no se si esta bien pero creo que funciona
            getVentana().limpiar_listener();
            getVentana().getBtn_1().addActionListener(new ActionListener() {

                public void processAction(ActionEvent evt) {
                    try {
                        //los roles del usuario en la base
                        Iterator<RolUsuario> rolusuario = usuarioseleccionado.getRolUsuarioCollection().iterator();
                        //eliminarlos
                        while (rolusuario.hasNext()) {
                            RolUsuario ru = rolusuario.next();
                            try {
                                rolusrjpa.destroy(ru.getId());
                            } catch (NonexistentEntityException ex) {
                                Logger.getLogger(usuarioBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                        usujpa.destroy(usuarioseleccionado.getId());
                        getLista();
                        cancel(evt);
                    } catch (IllegalOrphanException ex) {
                        getVentana().setTipo_ventana(eventosBakenBean.CERRAR);
                        getVentana().setPopup_header("Error al Guardar Ilegal");
                        getVentana().setPopup_conten(ex.getMessage());
                        getVentana().setPopup_visible(true);
                        Logger.getLogger(agenciaBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (NonexistentEntityException ex) {
                        getVentana().setTipo_ventana(eventosBakenBean.CERRAR);
                        getVentana().setPopup_header("Error al Guardar no existe Entidad");
                        getVentana().setPopup_conten(ex.getMessage());
                        getVentana().setPopup_visible(true);
                        Logger.getLogger(agenciaBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (Exception ex) {
                        getVentana().setTipo_ventana(eventosBakenBean.CERRAR);
                        getVentana().setPopup_header("Error al Guardar General");
                        getVentana().setPopup_conten(ex.getMessage());
                        getVentana().setPopup_visible(true);
                        Logger.getLogger(agenciaBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
        }
    }

    public void cancelar(ActionEvent evt) {
        this.usuarioseleccionado = null;
        this.disabled = true;
        this.btn_save_disable=true;
        getNav().setPagina_contenido("indicadores/indicadores.jspx");
    }

    public navegacionBakenBean getNav() {
        return nav;
    }

    public void setNav(navegacionBakenBean nav) {
        this.nav = nav;
    }

    public Usuario getUsuarioseleccionado() {
        return usuarioseleccionado;
    }

    public void setUsuarioseleccionado(Usuario usuarioseleccionado) {
        this.usuarioseleccionado = usuarioseleccionado;
    }

    public eventosBakenBean getVentana() {
        return ventana;
    }

    public void setVentana(eventosBakenBean ventana) {
        this.ventana = ventana;
    }

    public List<Usuario> getLista() {
        //Eliminar el usuario admin;
        List<Usuario> listUsers = usujpa.findUsuarioEntities();
//        for (Iterator<Usuario> it = listUsers.iterator(); it.hasNext();) {
//            Usuario usuario = it.next();
//            if (usuario.getId() == 1) {
//                it.remove();
//            }
//        }
        return listUsers;
    }

    public void setLista(List<Usuario> lista) {
        this.lista = lista;
    }

    public boolean isBtn_save_disable() {
        return btn_save_disable;
    }

    public void setBtn_save_disable(boolean btn_save_disable) {
        this.btn_save_disable = btn_save_disable;
    }

    public boolean isDisabled() {
        return disabled;
    }

    public void setDisabled(boolean disabled) {
        this.disabled = disabled;
    }
}
